#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>

/**
标准输入输出流 （File *）
    FILE *stdin;   标准输入
    FILE *stdout;  标准输出
    FILE *stderr;  标准错误输出
标准输出输出流的文件描述符
    STDIN_FILENO    0  标准输入
    STDOUT_FILENO   1  标准输出
    STDERR_FILENO   2  标准错误输出
 */

int main(int argc, char const *argv[])
{
    //关闭标准输出和标准错误输出(先后无影响)
    close(STDOUT_FILENO);
    close(STDERR_FILENO);

    //打开正常日志文件流(标准输出)先开
    open("std.log",O_WRONLY|O_CREAT|O_APPEND,0644);//fd必为1

    //打开错误日志文件流(错误输出)后开
    open("err.log",O_WRONLY|O_CREAT|O_APPEND,0644);//fd必为2
    

    //---------------------标准输入输出流有缓存 先存放到缓存里,最后输出到文件中---------------------------------

    //使用stdin读取输入
    char input_name[10];
    fgets(input_name,sizeof(input_name),stdin);
    printf("input_name:%s",input_name);//内部使用了stdout

    //使用stdout输出
    fputs("使用stderr显示输出\n",stdout); 

    //使用stderr显示错误信息
    fputs("使用stderr显示错误信息\n",stderr);

    //---------------------系统调用没有缓存 立刻输出到文件中--------------------------------------------------

    //使用STDIN_FILENO读取输入
    char input_name2[10];
    int len = read(STDIN_FILENO,input_name2,sizeof(input_name2));
    printf("使用STDIN_FILENO读取输入:%.*s",len,input_name2);

    //使用STDOUT_FILENO输出
    write(STDOUT_FILENO,"使用STDOUT_FILENO输出\n",strlen("使用STDOUT_FILENO输出\n"));

    //使用STDERR_FILENO输出显示错误信息
    write(STDERR_FILENO,"使用STDERR_FILENO输出显示错误信息\n",strlen("使用STDERR_FILENO输出显示错误信息\n"));

    return 0;
}
